package model;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;

public class BoomBox {
	private ArrayList<Musica> todasAsMusicas;
	private ArrayList<Usuario> todosOsUsuarios;
	
	public BoomBox(String localizacaoDasMusicas) throws IOException{
		this.todasAsMusicas = new ArrayList<Musica>();
		this.todosOsUsuarios = new ArrayList<Usuario>();
		leArquivoTexto(localizacaoDasMusicas,todasAsMusicas);
	}
	
	public void addMusica(Musica musica){
		todasAsMusicas.add(musica);
	}
	
	public void addUsuario(Usuario usuario){
		todosOsUsuarios.add(usuario);
	}	
	
	public ArrayList<Musica> getTodasAsMusicas() {
		return todasAsMusicas;
	}

	public ArrayList<Usuario> getTodasOsUsuarios() {
		return todosOsUsuarios;
	}
	
	public int numDeMusicasCadastradas(){
		return todasAsMusicas.size();
	}
	
	public int numDeUsuariosCadastrados(){
		return todosOsUsuarios.size();
	}
	
	private boolean removeUsuario(Usuario usuario){
		return todosOsUsuarios.remove(usuario);
	}
	
	public boolean removeUsuarioPeloEmail(String email) throws Exception{
		try {
			Usuario usuario = pesquisaPeloEmail(email);
			return removeUsuario(usuario);
		} catch (Exception ex){
			throw new Exception(ex.getMessage());
		}			
		
	}
	
	public ArrayList<Musica> pesquisaPorTitulo(String titulo){
		ArrayList<Musica> listaDeMusicasEncontradas = new ArrayList<Musica>();
		Iterator <Musica> iterador = todasAsMusicas.iterator();
		while (iterador.hasNext()){
			Musica musica = iterador.next();
			if(titulo.equals(musica.getTitulo())){
				listaDeMusicasEncontradas.add(musica);
			}
		}
		return listaDeMusicasEncontradas; // Se retornar vazio eh porque nao ha nenhuma musica com esse titulo
	}
	
	public ArrayList<Musica> pesquisaPorAlbum(String album){
		ArrayList<Musica> listaDeMusicasEncontradas = new ArrayList<Musica>();
		Iterator <Musica> iterador = todasAsMusicas.iterator();
		while (iterador.hasNext()){
			Musica musica = iterador.next();
			if(album.equals(musica.getAlbum())){
				listaDeMusicasEncontradas.add(musica);
			}
		}
		return listaDeMusicasEncontradas; // Se retornar vazio eh porque nao ha nenhuma musica com esse album
	}
	
	public ArrayList<Musica> pesquisaPorArtista(String artista){
		ArrayList<Musica> listaDeMusicasEncontradas = new ArrayList<Musica>();
		Iterator <Musica> iterador = todasAsMusicas.iterator();
		while (iterador.hasNext()){
			Musica musica = iterador.next();
			if(artista.equals(musica.getArtista())){
				listaDeMusicasEncontradas.add(musica);
			}
		}
		return listaDeMusicasEncontradas; // Se retornar vazio eh porque nao ha nenhuma musica com esse artista
	}
	
	public ArrayList<Musica> pesquisaPorGenero(String genero){
		ArrayList<Musica> listaDeMusicasEncontradas = new ArrayList<Musica>();
		Iterator <Musica> iterador = todasAsMusicas.iterator();
		while (iterador.hasNext()){
			Musica musica = iterador.next();
			if(genero.equals(musica.getGenero())){
				listaDeMusicasEncontradas.add(musica);
			}
		}
		return listaDeMusicasEncontradas; // Se retornar vazio eh porque nao ha nenhuma musica com esse genero
	}
	
	public ArrayList<Usuario> pesquisaPeloNome(String nome){
		ArrayList<Usuario> listaDeUsuariosEncontrados = new ArrayList<Usuario>();
		Iterator <Usuario> iterador = todosOsUsuarios.iterator();
		while (iterador.hasNext()){
			Usuario usuario = iterador.next();
			if(nome.equals(usuario.getNome())){
				listaDeUsuariosEncontrados.add(usuario);
			}			
		}
		return listaDeUsuariosEncontrados;
	}
	
	public Usuario pesquisaPeloEmail(String email) throws Exception{
		Iterator <Usuario> iterador = todosOsUsuarios.iterator();
		while (iterador.hasNext()){
			Usuario usuario = iterador.next();
			if(email.equals(usuario.getEmail())){
				return usuario;
			}			
		}
		throw new Exception("Esse usuario nao encontra-se cadastrado");
	}

	private void leArquivoTexto(String nomeArquivo, ArrayList<Musica> radio) throws IOException{
		BufferedReader arquivo = null;
		
		try{
			arquivo = new BufferedReader(new FileReader(nomeArquivo));
			String linha;
			
			while((linha = arquivo.readLine()) != null){
				String[] array = defineArrayComParametros(linha);
				Musica musica = criaEAddMusica(array);
				radio.add(musica);
				// System.out.println(radio.size()); // | Provando que as 253 músicas foram devidamente cadastradas.
						
				
			}
		}catch(Exception e){
			System.err.println(e.getMessage());
			
		}finally{
			if (arquivo != null) arquivo.close();
		}
		
	}
	
	private String[] defineArrayComParametros(String linha){
		String[] array = linha.split(":");  
		return array;
	}
	
	private Musica criaEAddMusica(String[] array){
		String titulo  = array[0];
		String album = array[1];
		String artista = array[2];
		String ano = array[3];
		String genero = array[4];
		String localArmazenado = array[5];
		Musica musica = new Musica(titulo, album, artista, ano, genero, localArmazenado);
		return musica;		
		
	}
	
	public static void main(String[] args) throws IOException{
		// Temos que tratar ainda essa questão da leitura do arquivo. Ao testar no de vocês mudem a localização do arquivo.
		String nome = "/home/gleyserb/workspace/Gleyser/src/model/musicas-nossaradio.txt";
		BoomBox radio = new BoomBox(nome); /* Nesse momento o construtor se encarrega de ler o arquivo,
		 criar os objetos do tipo musica, e adicioná-los na rádio */		
		
		
	}	
}
		
	

